#ifndef SIMPLE_SERVER_H
#define SIMPLE_SERVER_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostAddress>
#include <QSet>
#include <QHash>
#include <QAbstractSocket>

class SimpleServer : public QObject
{
    Q_OBJECT  // 必须：让 moc 生成信号/槽元对象

public:
    explicit SimpleServer(QObject *parent = nullptr);

    // 启动监听（addr 可用 AnyIPv4 / LocalHost / 指定 IP）
    bool start(const QHostAddress& addr, quint16 port);

    // === 新增：发送接口 ===
    // 向所有在线客户端发送一行原始数据；默认自动追加 '\n'
    int sendRawToAll(const QByteArray& data, bool addNewline = true);
    // 按 CSV 发送四个整数；顺序：湿度, 温度, 光照, co；默认自动追加 '\n'
    int sendCsvToAll(int hum, int temp, int light, int co, bool addNewline = true);

signals:
    // 有客户端接入
    void clientConnected(const QString& peer, const QString& local);

    // 收到一条完整数据（湿度、温度、光照、co）
    void dataReceived(int hum, int temp, int light, int co);

    void deviceBitsReceived(const QString& bits);   // ★ 新增

private slots:
    void onNewConnection();
    void onReadyRead();
    void onClientDisconnected();
    void onSocketError(QAbstractSocket::SocketError err); // ★ 已声明

private:
    QTcpServer* m_server = nullptr;
    QSet<QTcpSocket*> m_clients;
    QHash<QTcpSocket*, QByteArray> m_buf; // 行缓冲：每个 socket 对应一个缓冲

    // 解析一行：优先 JSON，再尝试 CSV/空白分隔
    bool parseLine(const QByteArray& line, int& hum, int& temp, int& light, int& co);
};

#endif // SIMPLE_SERVER_H
